package com.yeban.base.day05.homework;

import java.util.Scanner;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/9/29
 */

/*
分析以下需求，并用代码实现
    1.基础班考试要进行分组,键盘录入该班级总共多少组?以及每组的学生数量?
    2.根据录入的组数及每组学员的数量创建二维数组
    3.利用随机数产生0-100的成绩(包含0和100)
    4.要求:
        (1)打印该班级中每组的不及格人数
        (2)打印该班级中每组的平均分
        (3)打印组的最高平均分
        (4)打印班级中的不及格人数
        (5)打印班级平均分
        (6)演示格式如下:
            请输入班级总组数:3
            请输入班级中每组的人数:10
            控制台输出:
                第1组不及格人数为: 6 人
                第1组平均分为: 52
                第2组不及格人数为: 7 人
                第2组平均分为: 46
                第3组不及格人数为: 3 人
                第3组平均分为: 69
                班级中单组最高平均分为:69
                班级中不及格人数为: 16 人
                班级总平均分为: 56
 */

public class Test04 {

    // 键盘录入该班级总共多少组
    public int groupInput() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请录入该班级组数：");
        int groups = sc.nextInt();
        return groups;
    }

    // 键盘录入每组的学生数量
    public int[] groupNumbersInput(int groups) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请录入每组的学生数量：");
        int[] groupsNumbers = new int[groups];
        for (int i = 0; i < groups; i++) {
            groupsNumbers[i] = sc.nextInt();
        }
        return groupsNumbers;
    }

    // 根据组数groups和每组成员数groupNumbers创建二维数组，并用随机数赋值
    public int[][] scoresInformation(int groups, int[] groupNumbers) {

        int[][] scores = new int[groups][];

        // 遍历组数
        for (int i = 0; i < groups; i++) {
            // 每组数组长度 = 该组的实际人数（groupNumbers[i]）
                scores[i] = new int[groupNumbers[i]];

                // 用随机数赋值
                scoresInput(scores[i]);
        }

        return scores;

    }

    // 传入一个一维数组，用随机变量赋值
    public static int[] scoresInput(int[] groupNumbers) {

        for (int i = 0; i < groupNumbers.length; i++) {
            groupNumbers[i] = (int)(Math.random() * 101);
        }
        return groupNumbers;
    }

    // 计算不及格的方法
    public static int isPass(int score) {
        if(score > 60) {
            return 0;
        } else {
            return 1;
        }
    }

    // 计算每组不及格的人数
    public int failGroupNumbers(int[] groupScores) {
        int number = 0;
        for (int i = 0; i < groupScores.length; i++) {
            number += isPass(groupScores[i]);
        }
        return number;
    }

    // 计算平均分的方法
    public static int averageScore(int[] groupScores) {
        int sum = 0;
        int len = groupScores.length;
        for (int i = 0; i < len; i++) {
            sum += groupScores[i];
        }
        return sum / len;
    }

    // 查找一组数中的最大值
    public static int findMax(int[] arrays) {
        int max = arrays[0];
        int len = arrays.length;
        for (int i = 1; i < len; i++) {
            if (arrays[i] > max) {
                max = arrays[i];
            }
        }
        return max;
    }

    public void outputInformation(int[] failGroupNumbers, int[] averageScoreGroup, int averageMax, int failNumbers, int averageClass) {

        // 组数
        int groups = failGroupNumbers.length;

        for (int i = 0; i < groups; i++) {
            // (1)打印该班级中每组的不及格人数
            System.out.println(" 第" + (i+1) + "组不及格人数为: "+ failGroupNumbers[i] +" 人");

            // (2)打印该班级中每组的平均分
            System.out.println("第" + (i+1) +"组平均分为: " + averageScoreGroup[i]);
        }
        // (3)打印组的最高平均分
        System.out.println("班级中单组最高平均分为:" + averageMax);

        // (4)打印班级中的不及格人数
        System.out.println("班级中不及格人数为: " + failNumbers + " 人");

        // (5)打印班级平均分
        System.out.println("班级总平均分为:" + averageClass);
    }

    public static void main(String[] args) {

        //  创建Test04对象，来调用各个方法
        Test04 t = new Test04();

        // 键盘录入班级组数groups
        int groups = t.groupInput();
        // 键盘录入每组学生数量groupsNumbers
        int[] groupsNumbers = t.groupNumbersInput(groups);

        // 创建二维数组，并用随机数生成成绩（0~100）
        int[][] scores = t.scoresInformation(groups, groupsNumbers);

        // 计算每组的不及格人数
        int[] failGroupNumbers = new int[groups];
        //记录班级中的不及格人数
        int failNumbers = 0;
        for (int i = 0; i < groups; i++) {
            failGroupNumbers[i] = t.failGroupNumbers(scores[i]);
            failNumbers += failGroupNumbers[i];
        }

        // 每组平均分
        int[] averageGroup = new int[groups];
        // 班级总分和
        int averageSum = 0;
        // 班级中最大组平均分
        int averageMax = 0;
        for (int i = 0; i < groups; i++) {
            averageGroup[i] = t.averageScore(scores[i]);
            averageSum += averageGroup[i];

            // 查找各组中的最大平均分
            averageMax = findMax(averageGroup);
        }
        // 班级平均分
        int averageClass = averageSum / groups;

        // 控制台输出（每组不及格人数，每组平均分，班级最高平均分，班级不及格人数，班级平均分）
        t.outputInformation(failGroupNumbers, averageGroup, averageMax, failNumbers, averageClass);

    }
}
